<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
require_once __DIR__ . '/error.php';
// 应用公共文件
/**
 * 返回错误信息
 * @param $code
 * @return mixed
 */
function codeMessage($code)
{
    global $error;
    if (!isset($error[$code])) {
        return $error[-1];
    }
    return $error[$code];
}

/**
 * 密码加密
 * @access public
 * @param string $string 需要加密字符串
 * @param string $string 密钥
 * @since 1.0
 * @return string
 */
function passwordEncryption($string, $pwd_key)
{
    return sha1(md5($string . '&' . $pwd_key));
}

function createPassport()
{
    // 密码字符集，可任意添加你需要的字符
    $chars = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
        'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
        't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
        'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
        'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
        '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
        '[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
        '.', ';', ':', '/', '?', '|');
    // 在 $chars 中随机取 $length 个数组元素键名
    $keys = array_rand($chars, $length = 32);
    $password = '';
    for ($i = 0; $i < $length; $i++) {
        // 将 $length 个数组元素连接成字符串
        $password .= $chars[$keys[$i]];
    }

    return md5($password . time());
}

/**
 * 驼峰命名转下划线命名
 * 思路:
 * 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
 */
function humpToUnderline($camelCaps, $separator = '_')
{
    return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
}

/**
 * 获取随机字符串
 * @access protected
 * @param int $n 随机数的长度(默认32位)
 * @since 1.0
 * @return string
 */
function _getRandomString($n = 32)
{
    $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//输出字符集
    $len = strlen($str) - 1;
    $s = '';
    for ($i = 0; $i < $n; $i++) {
        $s .= $str[rand(0, $len)];
    }
    return $s;
}

/**
 * 当参数和规则不匹配时，提示错误
 * @param string $type
 * @param string $param
 * @param int $code
 * @return bool
 */
function _toValidate($type, $param, $code)
{
    $str_rule = ''; // 验证规则

    switch ($type) {
        case 'id': // 大于0整数验证(必须时大于0的数字)
            $str_rule = '/^[1-9]\d*$/';
            break;
        case 'mobile': // 手机号码验证
            $str_rule = '/^1[34578][0-9]{9}$/';
            break;
        case 'verify_code': // 短信验证码验证
            $str_rule = '/^(\d{4})|(\d{6})$/';
            break;
        case 'login_pwd': // 登录密码验证
            $str_rule = '/^[\w+]{6,16}$/';
            break;
        case 'pay_pwd': // 支付密码验证
            $str_rule = '/^\d{6}$/';
            break;
        case 'time': // 时间
            $str_rule = '/^(((20[0-3][0-9]-(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|(20[0-3][0-9]-(0[2469]|11)-(0[1-9]|[12][0-9]|30))))|(((20[0-3][0-9]-(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|(20[0-3][0-9]-(0[2469]|11)-(0[1-9]|[12][0-9]|30))) (20|21|22|23|[0-1][0-9]):[0-5][0-9]:[0-5][0-9])$/';
            break;
        case 'date': // 时间
            $str_rule = '/^((((19|20)\d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d{2})-(0?[13578]|1[02])-31)|(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$/';
            break;
        case 'passport': // 登录票据
            $str_rule = '/^[0-9a-zA-Z]{32}$/';
            break;
        case 'account': // 登录账号
            $str_rule = '/^[0-9a-zA-Z]{4,23}$/';
            break;
        case 'money': // 金额
            $str_rule = '/^[0-9]+(.[0-9]{1,2})?$/';
            break;
        case 'math': // 大于0整数验证(必须时大于0的数字)
            $str_rule = '/^[0-9]\d*$/';
            break;
        case 'id_card': // 身份证验证
            $str_rule = '/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/';
            break;
        default:
            _returnError($code);
    }

    if (!preg_match($str_rule, $param)) {
        _returnError($code);
    }
    return true;
}

/**
 * 当"参数1"和"参数2"对比值为true时，提示错误
 * @param mixed $param1 参数1
 * @param string $symbol 对比的符号（目前只支持!=、==、===、>、<）
 * @param mixed $param2 参数2
 * @param string $code 错误码
 */
function _toCompare($param1, $symbol, $param2, $code)
{
    switch ($symbol) {
        case '!=': // 不等于
            $bool_status = ($param1 != $param2) ? true : false;
            break;
        case  '==': // 等于
            $bool_status = ($param1 == $param2) ? true : false;
            break;
        case  '===': // 全等于
            $bool_status = ($param1 === $param2) ? true : false;
            break;
        case '>': // 大于
            $bool_status = ($param1 > $param2) ? true : false;
            break;
        case '<': // 小于
            $bool_status = ($param1 < $param2) ? true : false;
            break;
        case '>=': // 大于
            $bool_status = ($param1 >= $param2) ? true : false;
            break;
        case '<=': // 小于
            $bool_status = ($param1 <= $param2) ? true : false;
            break;
        default:
            $bool_status = true;

    }

    if ($bool_status === true) {
        _returnError($code);
    }

    return true;
}

/**
 * 返回错误信息（JSON）
 * @access protected
 * @param string $code 返回的错误码
 * @since 1.0
 */
function _returnError($code)
{
    echo json_encode([
        'code' => $code,
        'reason' => codeMessage($code)
    ], JSON_UNESCAPED_UNICODE);
    die();
}

/**
 * 将对象转换为数组
 * @param $array
 * @return array
 */
function _objectToArray($array)
{
    if (is_object($array)) {
        $array = (array)$array;
    }
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            $array[$key] = _objectToArray($value);
        }
    }
    return $array;
}

/**
 * 返回数据（JSON）
 * @access protected
 * @param array $data 需要返回的数据
 * @param string $message 需要返回提示信息
 * @since 1.0
 * @return string
 */
function _returnData(array $data = [], $message = '请求成功')
{
    echo json_encode([
        'code' => 0,
        'reason' => $message,
        'data' => $data
    ]);
    die();
}
